package controlador;

import java.util.LinkedList;
import javax.swing.JFrame;
import algo3.display.*;
import vista.*;
import modelo.Configuracion;
import modelo.Data;
import modelo.auto.Auto;
import modelo.juego.Juego;
import modelo.juego.Usuario;
import modelo.escenario.Taller;

public class StreetRoadApplication {
	/*CONSTANTES*/
	
	public static final int INICIO  		= 0;
	public static final int CARGA_USUARIO  	= 1;
	public static final int NUEVO_USUARIO  	= 2;
	public static final int MENU  			= 3;
	public static final int JUEGO		   	= 4;
	public static final int TALLER  		= 5;
	public static final int RESULTADOS  	= 6;
	public static final int AYUDA		  	= 7;
	public static final int CREDITOS 		= 8;
	
	/*ATRIBUTOS ESTATICOS*/
	private static StreetRoadApplication instancia;
	
	/*ATRIBUTOS*/
	private JFrame 	parentFrame;
	private Ventana ventanaActual;
	private Data	data;
	private Usuario usuario;
	
	/*METODOS ESTATICOS*/
	
	
	/*Retorna la unica instancia posible de StreetRoadApplication.
	 * StreetRoadApplication es Singleton*/
	public static StreetRoadApplication getInstancia() {
		if(instancia == null) {
			instancia = new StreetRoadApplication();
		}
		return instancia;
	}
	
	/*METODOS PUBLICOS*/
	private StreetRoadApplication () {
	}
	
	
	public void inicializar (JFrame frame) {
		
		// Controlador Principal
		parentFrame = frame;
		
		// Modelo
		try {
			data = Data.crearNueva();
			data.guardar(Configuracion.PATH_DATA);
		}
		catch(Exception e){ 
			System.out.print(e);
		};
		
		siguienteVentana(MENU);
	}
	
	public void siguienteVentana(int ventanaId) {
		
		if(ventanaActual != null) ventanaActual.destroy();

		int ancho = Configuracion.ANCHO_VENTANA;
		int alto = Configuracion.ALTO_VENTANA;
		
		switch (ventanaId) {
		case AYUDA:
			ventanaActual = new VAyuda(parentFrame, ancho ,alto);
			break;

		case CREDITOS:
			ventanaActual = new VCreditos(parentFrame, ancho ,alto);
			break;

		case NUEVO_USUARIO:
			ventanaActual = new VNuevoUsuario(parentFrame, ancho ,alto);
			break;
		case MENU:
			ventanaActual = new VMenu(parentFrame, ancho ,alto);
			break;
		case TALLER:
			Taller taller = new Taller(data.getElementosTaller());
			ventanaActual = new VTaller(parentFrame, ancho ,alto, taller);
			break;
		case JUEGO:
			Juego juego = new Juego(usuario, data.getPistas());
			ventanaActual = new VJuego(parentFrame, ancho ,alto);
			((VJuego)ventanaActual).inicializar(juego);	
			
			juego.start();
			break;
		}
	}
	
	//para saber el nombre de usuario actual
	public String getNombreUsuarioActual(){
		return usuario.getNombre();
	}
	
	public double getDineroUsuarioActual(){
		return usuario.getDinero();
	}
	
	public int getPuntosUsuarioActual(){
		return usuario.getPuntos();
	}
	public Usuario getUsuarioActual(){
		return usuario;
	}
	
	public LinkedList<Usuario> getListaUsuarios(){
		return data.getUsuarios();
	}
	
	public void nuevoUsuario(String nombre){
		usuario = new Usuario(nombre, Configuracion.MONTO_INICIAL, Configuracion.PUNTOS_INICIALES, new Auto());
		data.getUsuarios().add(usuario);
		guardarData();
	}
	
	public void setUsuarioActual(int i) {
		usuario = data.getUsuarios().get(i);
	}
	
	public void guardarData() {
		try {
			data.guardar(Configuracion.PATH_DATA);
		}
		catch(Exception e){ 
			System.out.print(e);
		};
	}
}
